package com.learn.javase.chapter18.reflect.proxy.jdk;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Proxy;

/**
 * @author wsh
 * @date 2022-05-11 15:20
 */
public class TestReflectProxy {
    @SuppressWarnings("unchecked")
    public static void main(String[] args) throws Exception {
        // 1、创建目标类
        InvocationHandler myInvocationHandler = new MyInvocationHandler();
        // 2、通过反射调用代理类的构造方法创建代理实例
        Class proxyClass = Proxy.getProxyClass(Person.class.getClassLoader(), new Class[]{Person.class});
        Constructor constructor = proxyClass.getConstructor(new Class[]{InvocationHandler.class});
        Person person = (Person) constructor.newInstance(myInvocationHandler);
        // 3、调用代理对象的方法，都会转成对InvocationHandler.invoke()的调用（即调用真实的服务）
        person.walk();
        person.sayHello();
        /**
         * 输出结果：
         * 正在执行方法：walk
         * 该方法调用无实参！
         * 正在执行方法：sayHello
         * 该方法调用无实参！
         */
    }
}
